Tensorlistsetitem
将输入的张量(item)替换到张量列表(TensorList)中指定索引位置。该算子创建一个新的张量列表,其中在指定索引位置的张量被替换为输入的新张量,而其他位置的张量保持不变。
该算子不区分具体的数据类型,通过copy_size参数指定每个张量的数据量大小。
- 输入:
in_data - 输入张量列表指针(void**类型),指向原始张量列表中的各个张量数据。
in_item - 输入张量指针(void*类型),表示要替换到张量列表中的新张量数据。
index - 要替换的张量在列表中的索引位置(int类型)。
tensorlist_size - 张量列表中包含的张量个数(int类型)。
copy_size - 每个张量的数据量大小数组(int*类型),以字节为单位,表示每个张量需要复制的字节数。
core_mask - 核掩码(int类型),仅共享存储版本需要。
- 输出:
out_data - 输出张量列表指针(void**类型),存储替换操作后的张量列表,其中index位置的张量被替换为in_item。
- 支持平台:
FT78NEMT7004
备注
该算子不区分具体的数据类型,通过copy_size参数控制复制的字节数
调用前需要确保out_data指向的内存空间足够大,能够存储所有张量数据
索引index必须在有效范围内(0 <= index < tensorlist_size)
算子会复制所有张量数据,输出张量列表与输入张量列表数据独立
共享存储版本:
-
void tensorlistsetitem_s(void **in_data, void *in_item, void **out_data, int index, int tensorlist_size, int *copy_size, int core_mask)
C调用示例(共享存储版本):
1#include <stdio.h>
2#include <tensorlistsetitem.h>
3
4int main(int argc, char* argv[]) {
5 // 假设在DDR空间
6 int tensorlist_size = 3; // 张量列表包含3个张量
7 int index = 1; // 替换索引为1的张量
8
9 // 输入张量列表
10 float *in_tensor0 = (float *)0xA0000000;
11 float *in_tensor1 = (float *)0xA0010000;
12 float *in_tensor2 = (float *)0xA0020000;
13 void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
14
15 // 输入item
16 float *in_item = (float *)0xA0030000;
17
18 // 输出张量列表
19 float *out_tensor0 = (float *)0xB0000000;
20 float *out_tensor1 = (float *)0xB0010000;
21 float *out_tensor2 = (float *)0xB0020000;
22 void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
23
24 // 每个张量的数据量大小
25 int copy_size[3] = {40, 40, 40};
26
27 // 核掩码
28 int core_mask = 0xff;
29
30 // 调用共享存储版本的函数
31 tensorlistsetitem_s(in_data, in_item, out_data, index, tensorlist_size, copy_size, core_mask);
32
33 return 0;
34}
私有存储版本:
-
void tensorlistsetitem_p(void **in_data, void *in_item, void **out_data, int index, int tensorlist_size, int *copy_size)
C调用示例(私有存储版本):
1#include <stdio.h>
2#include <tensorlistsetitem.h>
3
4int main(int argc, char* argv[]) {
5 // 假设在L2空间
6 int tensorlist_size = 3; // 张量列表包含3个张量
7 int index = 1; // 替换索引为1的张量
8
9 // 输入张量列表(假设已初始化)
10 float *in_tensor0 = (float *)0x10000000; // 第一个张量
11 float *in_tensor1 = (float *)0x10001000; // 第二个张量(将被替换)
12 float *in_tensor2 = (float *)0x10002000; // 第三个张量
13 void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
14
15 // 输入item(新张量数据)
16 float *in_item = (float *)0x10003000;
17
18 // 输出张量列表(需要预先分配内存)
19 float *out_tensor0 = (float *)0x10004000;
20 float *out_tensor1 = (float *)0x10005000;
21 float *out_tensor2 = (float *)0x10006000;
22 void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
23
24 // 每个张量的数据量大小(假设每个张量有10个float元素,每个float 4字节)
25 int copy_size[3] = {40, 40, 40}; // 40字节 = 10 * 4
26
27 // 调用私有存储版本的函数
28 tensorlistsetitem_p(in_data, in_item, out_data, index, tensorlist_size, copy_size);
29
30 return 0;
31}